﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Data;
using System.Globalization;

namespace SoftHotel.Models
{
    public class DetalleReservaEvDAO
    {
        private Conexion conexionBD = new Conexion();
        ReservaEvDAO reservaDAO = new ReservaEvDAO();

        public List<DetalleReservaEv> ejecutar_query(Int32 id)
        {

            string consulta = "";
            conexionBD.AbrirConexion();
            List<DetalleReservaEv> detreservaEventos = new List<DetalleReservaEv>();

            consulta = "select IDDETALLERESERVA, idReserva, IDAMBIENTE, numeroItem, precioUnitario, fecha, convert(varchar, horainicio, 108), convert(varchar, horafin, 108) from DETALLERESERVA where IDReserva=" + id;

            SqlDataReader dataReader = conexionBD.EjecutarReader(consulta);

            while (dataReader != null && dataReader.Read())
            {
                DetalleReservaEv detalle = new DetalleReservaEv();
                detalle.idDetalle = dataReader.GetInt32(0);
                detalle.idReserva = dataReader.GetInt32(1);
                detalle.idAmbiente = dataReader.GetInt32(2);
                detalle.numItem = dataReader.GetInt32(3);
                if (!dataReader.IsDBNull(4)) detalle.precioUnit = dataReader.GetDecimal(4);

                if (!dataReader.IsDBNull(5))  detalle.fecha = dataReader.GetDateTime(5);

                detalle.fechaRes = detalle.fecha.ToShortDateString();
                detalle.hora_ini = dataReader[6].ToString();
                detalle.hora_fin = dataReader[7].ToString();


                //busq ambiente
                string consulta1 = "";
                consulta1 = "SELECT NOMBRE FROM AMBIENTE WHERE IDAMBIENTE =" + detalle.idAmbiente;


                SqlDataReader dataReader1 = conexionBD.EjecutarReader(consulta1);
                dataReader1.Read();
                
                detalle.ambiente = dataReader1[0].ToString();


                detreservaEventos.Add(detalle);
            }
            conexionBD.CerrarConexion();
            return detreservaEventos;
        }
        
        
        
        
        public void add_detalle(DetalleReservaEv detalle)
        {

            detalle.precioUnit = buscar_precio(detalle);

            string consulta = "";
            conexionBD.AbrirConexion();

            consulta = "INSERT INTO DETALLERESERVA (IDRESERVA, IDAMBIENTE, NUMEROITEM, FECHA, HORAINICIO, HORAFIN , PRECIOUNITARIO, TOTAL  )" +
                        "VALUES (@idreserva,@idambiente,@numitem, @fecha, @hora_ini , @hora_fin, @precio, @precio)";

            SqlCommand command = conexionBD.connection.CreateCommand();
            command.CommandText = consulta;

            /*int cat = buscarSede(ambiente.sede);
            int est = buscarTipoDeAmbiente(ambiente.tipoAmbiente);*/

            command.Parameters.Add("@idreserva", SqlDbType.Int).Value = detalle.idReserva;
            command.Parameters.Add("@idambiente", SqlDbType.Int).Value = detalle.idAmbiente;
            command.Parameters.Add("@numitem", SqlDbType.Char, 10).Value = detalle.numItem;
            command.Parameters.Add("@fecha", SqlDbType.DateTime).Value = Convert.ToDateTime(detalle.fecha);
            command.Parameters.Add("@hora_ini", SqlDbType.DateTime).Value = Convert.ToDateTime("01/10/2009 " + detalle.hora_ini, new CultureInfo("en-US"));
            command.Parameters.Add("@hora_fin", SqlDbType.DateTime).Value = Convert.ToDateTime("01/10/2009 " + detalle.hora_fin, new CultureInfo("en-US"));
            command.Parameters.Add("@precio", SqlDbType.Decimal).Value = detalle.precioUnit;
            

            conexionBD.EjecutarComando2(command);
            reservaDAO.actualizar_monto(detalle.idReserva);


        }

        public bool buscar_coincidencia(DetalleReservaEv detalle)
        {

            string consulta1 = "";
            consulta1 = "SELECT idReserva, convert(varchar, horainicio, 108), convert(varchar, horafin, 108) FROM DETALLERESERVA WHERE IDAMBIENTE = @id  AND FECHA = @fe AND ((HORAINICIO BETWEEN @horaini AND @horafin) OR (HORAFIN BETWEEN @horaini AND @horafin))";
           
            
            
            SqlDataReader dataReader = null;
            conexionBD.AbrirConexion();
                SqlCommand command = conexionBD.connection.CreateCommand();
                command.CommandText = consulta1;
                command.Parameters.Add("@id", SqlDbType.Int).Value = detalle.idAmbiente;

                command.Parameters.Add("@fe", SqlDbType.DateTime).Value = Convert.ToDateTime(detalle.fecha);
                command.Parameters.Add("@horaini", SqlDbType.DateTime).Value = Convert.ToDateTime("01/10/2009 " + detalle.hora_ini, new CultureInfo("en-US"));
                command.Parameters.Add("@horafin", SqlDbType.DateTime).Value = Convert.ToDateTime("01/10/2009 " + detalle.hora_fin, new CultureInfo("en-US"));

                dataReader = command.ExecuteReader();

                if (dataReader.HasRows)
                {
                    detalle.conflicto = "";
                    while (dataReader != null && dataReader.Read())
                    {
                        detalle.conflicto = detalle.conflicto + "Reserva No: ";

                        detalle.conflicto = detalle.conflicto + dataReader[0].ToString();
                        detalle.conflicto = detalle.conflicto + " Hora reservada: De ";

                        detalle.conflicto = detalle.conflicto + dataReader[1].ToString();
                        detalle.conflicto = detalle.conflicto + " Hasta ";
                        detalle.conflicto = detalle.conflicto + dataReader[2].ToString() + "  ";

                    }
                }

                
            return (dataReader.HasRows);

            
        }


        public Decimal buscar_precio(DetalleReservaEv detalle)
        {
            AmbienteDAO ambDAO = new AmbienteDAO();
            string id = detalle.idAmbiente.ToString();

            String consulta = "";
            consulta = "SELECT idAmbiente, idSede, nombre, tipoAmbiente, piso, disponible, capacidad, descripcion, estado FROM AMBIENTE WHERE idAmbiente = \'" + id + "\'";
            conexionBD.AbrirConexion();
            SqlDataReader dataReader = conexionBD.EjecutarReader(consulta);

            Ambiente amb = new Ambiente();
            while (dataReader != null && dataReader.Read())
            {
                amb.idAmbiente = Convert.ToInt32(dataReader[0].ToString());
                amb.idSede = Convert.ToInt32(dataReader[1].ToString());
                amb.nombre = dataReader[2].ToString();
                amb.tipoAmbiente = Convert.ToInt32(dataReader[3].ToString());
                amb.piso = Convert.ToInt32(dataReader[4].ToString());
                amb.disponible = Convert.ToBoolean(dataReader[5].ToString());
                amb.descripcion = dataReader[6].ToString();
            }

            dataReader.Close();
            

            string consulta1 = "";
            consulta1 = "SELECT precio FROM DetallePrecio WHERE tipoambiente = @tipo ";

            SqlDataReader dataReader1 = null;
            conexionBD.AbrirConexion();
            SqlCommand command = conexionBD.connection.CreateCommand();
            command.CommandText = consulta1;
            command.Parameters.Add("@tipo", SqlDbType.Int).Value = amb.tipoAmbiente;

            dataReader1 = command.ExecuteReader();

            dataReader1.Read();

            if (!dataReader1.HasRows) return 0;
            else return dataReader1.GetDecimal(0);
            

        }


     

        public void editar_detalle(Int32 id, DetalleReservaEv detalle)
        {
            string update = "";
            conexionBD.AbrirConexion();


            update = "UPDATE DETALLERESERVA SET idambiente= @idambiente, fecha = @fecha, HORAINICIO= @horaini, HORAFIN = @horafin , PRECIOUNITARIO =@precio, TOTAL=@precio " +
                        " WHERE IDDETALLERESERVA = @id";

            SqlCommand command = conexionBD.connection.CreateCommand();
            command.CommandText = update;

            /*int cat = buscarSede(ambiente.sede);
            int est = buscarTipoDeAmbiente(ambiente.tipoAmbiente);*/

            command.Parameters.Add("@idambiente", SqlDbType.Int).Value = detalle.idAmbiente;

            command.Parameters.Add("@fecha", SqlDbType.DateTime).Value = Convert.ToDateTime(detalle.fecha);
            command.Parameters.Add("@horaini", SqlDbType.DateTime).Value = Convert.ToDateTime("01/10/2009 " + detalle.hora_ini,new CultureInfo("en-US"));
            command.Parameters.Add("@horafin", SqlDbType.DateTime).Value = Convert.ToDateTime("01/10/2009 " + detalle.hora_fin, new CultureInfo("en-US"));
            command.Parameters.Add("@id", SqlDbType.Int).Value = id;
            detalle.precioUnit = buscar_precio(detalle);
            command.Parameters.Add("@precio", SqlDbType.Decimal).Value = detalle.precioUnit;


            conexionBD.EjecutarComando2(command);

            reservaDAO.actualizar_monto(detalle.idReserva);
        }




        public DetalleReservaEv consultar_detalle(Int32 id)
        {
            string consulta = "";
            conexionBD.AbrirConexion();
            DetalleReservaEv detalle = new DetalleReservaEv();

            consulta = "select IDDETALLERESERVA, idReserva, IDAMBIENTE, numeroItem, precioUnitario,fecha, convert(varchar, horainicio, 108), convert(varchar, horafin, 108) from DETALLERESERVA where IDDETALLERESERVA= \'" + id + "\'";

            SqlDataReader dataReader = conexionBD.EjecutarReader(consulta);

            dataReader.Read();
            
               
                detalle.idDetalle = dataReader.GetInt32(0);
                detalle.idReserva = dataReader.GetInt32(1);
                detalle.idAmbiente = dataReader.GetInt32(2);
                detalle.numItem = dataReader.GetInt32(3);
                if (!dataReader.IsDBNull(4))  detalle.precioUnit = dataReader.GetDecimal(4);

                if (!dataReader.IsDBNull(5)) detalle.fecha = dataReader.GetDateTime(5);
                detalle.fechaRes = detalle.fecha.ToShortDateString();
                detalle.hora_ini = dataReader[6].ToString();
                detalle.hora_fin = dataReader[7].ToString();

                
            conexionBD.CerrarConexion();
            return detalle;
        }


        public string generarID()
        {
            String consulta = "SELECT SUBSTRING(MAX(codigo),4,7) FROM DETALLERESERVA";
            SqlDataReader dataReader = conexionBD.EjecutarReader(consulta);
            dataReader.Read();
            string aux = dataReader[0] + "";
            int r;
            if (aux == "") r = 1;
            else r = Convert.ToInt32(aux) + 1;

            string id = r.ToString();
            int nrodig = id.Length;

            for (int i = 1; i <= 7 - nrodig; i++)
                id = "0" + id;
            id = "DRS" + id;
            dataReader.Close();
            return id;
        }

        public void eliminar_detalle(int id, DetalleReservaEv detalle)
        {
            string delete = "";
            conexionBD.AbrirConexion();
            delete = "DELETE FROM DETALLERESERVA WHERE IDDETALLERESERVA = @id";
            SqlCommand command = conexionBD.connection.CreateCommand();
            command.CommandText = delete;
            command.Parameters.Add("@id", SqlDbType.Int).Value = id;
            conexionBD.EjecutarComando2(command);
            reservaDAO.actualizar_monto(detalle.idReserva);



        }

    }
}